#ifndef MENU_H
#define MENU_H

#include "heating.h"

// 菜单数据结构
typedef struct
{
    uint8_t layer;
    uint8_t page;
    uint8_t num;
    uint8_t set_temp;
    uint8_t temp;
    uint8_t power;
    uint16_t time;       // 使用时间 单位：s
    uint8_t mode;
    uint16_t V;

} MENU_DATA_str;

typedef enum
{
    menu_T1,
    menu_T2,
    menu_T3,
    menu_B1,
    menu_B2,
    menu_B3,
    menu_S1,
    menu_S2,
    menu_S3,
}ty_mode_enum;


// 滑条数据结构
typedef struct
{
    uint8_t x_y;        // 滑控 0：x轴滑条 1：y轴滑条
    uint8_t x;          // 滑控起始位置
    uint8_t y;          // 滑控起始位置
    uint8_t len;        // 滑控长度
    uint8_t wide;        // 滑控宽度
    uint8_t value;      // 滑控数值
    uint8_t value_max;  // 滑控数值最大值
    uint8_t box_len;  // 方块宽度

    uint8_t box_speed;  // 方块移动速度

}SLIDER_str;


typedef char * string;

void menu_control_create(void);

void menu_init(void);

SLIDER_str * menu_slider_y_create(uint8_t _value);

void menu_slider_xy_draw(SLIDER_str * slider_y);

#define TEST_SPEED 10               // 测试用速度
#define SET_STRING_NUMBER  17       // 设置字符串数量






// 功能选择
// 参数选择
// 工作状态

#define DIS_FUHAO_ID(_char)    (_char - ' ')

typedef enum
{
    MENU_LAYER_SW = 0,      // 功能选择
    MENU_LAYER_SET,         // 所选功能参数选择
    MENU_LAYER_SET_MODE,     // 对应设置参数设置
    MENU_LAYER_SET_DATA,    // 对应设置参数设置
    MENU_LAYER_SET_TIME,
    MENU_LAYER_WORK,
    MENU_LAYER_MAX,
}LAYER_ENUM;


typedef enum
{
    FUNCTION_STATE = 0,
    FUNCTION_CONTROL,
    FUNCTION_HEATING,
    FUNCTION_REFLOW,
    FUNCTION_SET,
    FUNCTION_MAX,
}FUNCTION_ENUM; // 功能显示

typedef enum
{
    NO_WORK = 0,
    CONTROL_T1,
    CONTROL_T2,
    CONTROL_T3,
    HEATING_B1,
    HEATING_B2,
    HEATING_B3,
    REFLOW_S1,
    REFLOW_S2,
    REFLOW_S3,
    WORK_MAX,
}WORK_ENUM; // 工作模式

typedef enum
{
    SET_T1_TEMP,
    SET_T2_TEMP,
    SET_T3_TEMP,
    SET_B1_TEMP,
    SET_B2_TEMP,
    SET_B3_TEMP,
    SET_S1_TEMP,
    SET_S2_TEMP,
    SET_S3_TEMP,
    SET_TEMP_ADJUST,
    SET_KP,
    SET_KI,
    SET_KD,
    SET_MAX_TIME,       // 更改为工作时间设置
    SET_MAX_POWER,
    SET_RESET,
    VERSION,
    SET_MAX,
}SET_DATA_ENUM; // 设置数据


typedef enum
{
    SET_TEMP = 0,           // 设置温度
    SET_TIME = 1,               // 设置时间
    SET_TEMP_1 = 0,
    SET_TIME_1,
    SET_TEMP_2,
    SET_TIME_2,
    SET_TEMP_3,
    SET_TIME_3,

}SET_TIME_ENUM; // 设置时间



typedef struct
{
    LAYER_ENUM layer;                  // 层数
    LAYER_ENUM layer_last;             // 上一个层数
    FUNCTION_ENUM function;            // 功能
    // FUNCTION_ENUM function_last;        // 上一个功能
    WORK_ENUM work;                    // 工作模式
    WORK_ENUM work_OK;
    // WORK_ENUM work_last;                // 上一个工作模式
    SET_DATA_ENUM set_data;            // 设置数据 设置第一阶段选择对象
    SET_DATA_ENUM set_data_last;        // 上一个设置数据
    SET_TIME_ENUM set_time;            // 设置时间  设置第二阶段选择对象
    SET_TIME_ENUM set_time_last;        // 上一个设置时间
    // SET_DATA_ENUM set_mode;

// 当前显示界面  页面切换需要更新窗口计数器
    uint8_t window_cnt;                 // 窗口计数
    // 当前行数计数器
    uint8_t current_row;                // 当前行数

    // 设置数据完成 不闪烁
    uint8_t set_mode_ok : 1;
    uint8_t set_data_ok : 1;
    uint8_t set_time_ok : 1;
    uint8_t set_work_ok : 1;
    uint8_t : 4;

    uint8_t set_blink_cnt;              // 设置数据闪烁计数器
    uint8_t set_blink_light;            // 设置数据闪烁状态

    char dis_buf[12];

    // 显示参数
    uint8_t set_temp;
    uint8_t temp;
    uint8_t power_value;
    uint16_t work_time;
    uint16_t power_volatage;    // 电源电压


}MENU_C_STR;


extern MENU_C_STR menu;

#define SET_TEMP_X 0            // 设置温度显示位置
#define SET_TEMP_Y 0            // 设置温度显示位置

#define SET_LABLE_X  0          // 设置标签显示位置
#define SET_VALUE_X  80         // 设置数值显示位置
#define SET_LABLE_Y_LENG  16    // 设置标签Y方向长度

#define SET_TIME_VALUE_X  60     // 设置时间数值显示位置

// 闪烁周期
#define BLINK_CYCLE  8        // 闪烁周期 1秒
#define BLINK_LIGHT  4         // 点亮时间
// 闪烁条件
#define  BLINK_TIME  1000        // 闪烁时间

#define SET_DATA_NUM_MAX  SET_STRING_NUMBER         // 设置数据数量


// 定义设置数据范围
#define MAX_T_TEMP  230        // 最大温度 单位：℃
#define MIN_T_TEMP  80         // 最小温度 单位：℃

#define MAX_T_TIME  60         // 最大时间 单位：min
#define MIN_T_TIME  1          // 最小时间 单位：min

#define MAX_B_TEMP  100        // 最大温度 单位：℃
#define MIN_B_TEMP  40         // 最小温度 单位：℃

#define MAX_B_TIME  600        // 最大时间 单位：min
#define MIN_B_TIME  10

#define MAX_S_TEMP_1  180      // 最大温度 单位：℃
#define MIN_S_TEMP_1  120      // 最小温度 单位：℃

#define MAX_S_TIME_1  90       // 最大时间 单位：s
#define MIN_S_TIME_1  60

#define MAX_S_TEMP_2  200      // 最大温度 单位：℃
#define MIN_S_TEMP_2  150      // 最小温度 单位：℃

#define MAX_S_TIME_2  120      // 最大时间 单位：s
#define MIN_S_TIME_2  60

#define MAX_S_TEMP_3  230      // 最大温度 单位：℃
#define MIN_S_TEMP_3  180      // 最小温度 单位：℃

#define MAX_S_TIME_3  180      // 最大时间 单位：s
#define MIN_S_TIME_3  80

// 定义数据默认值
#define DEFAULT_T_TEMP_T1  80          // 默认温度 单位：℃
#define DEFAULT_T_TEMP_T2  120         // 默认温度 单位：℃
#define DEFAULT_T_TEMP_T3  200         // 默认温度 单位：℃

#define DEFAULT_T_TIME_T1  60         // 默认时间 单位：min
#define DEFAULT_T_TIME_T2  40         // 默认时间 单位：min
#define DEFAULT_T_TIME_T3  10         // 默认时间 单位：min

#define DEFAULT_B_TEMP_T1  50         // 默认温度 单位：℃
#define DEFAULT_B_TEMP_T2  60         // 默认温度 单位：℃
#define DEFAULT_B_TEMP_T3  70         // 默认温度 单位：℃

#define DEFAULT_B_TIME_T1  (60 * 8)         // 默认时间 单位：min
#define DEFAULT_B_TIME_T2  (60 * 8)         // 默认时间 单位：min
#define DEFAULT_B_TIME_T3  (60 * 8)         // 默认时间 单位：min

#define DEFAULT_S1_TEMP_T1  120         // 默认温度 单位：℃
#define DEFAULT_S1_TEMP_T2  150         // 默认温度 单位：℃
#define DEFAULT_S1_TEMP_T3  210         // 默认温度 单位：℃

#define DEFAULT_S1_TIME_T1  120         // 默认时间 单位：s
#define DEFAULT_S1_TIME_T2  120         // 默认时间 单位：s
#define DEFAULT_S1_TIME_T3  120         // 默认时间 单位：s

#define DEFAULT_S2_TEMP_T1  150         // 默认温度 单位：℃
#define DEFAULT_S2_TEMP_T2  180         // 默认温度 单位：℃
#define DEFAULT_S2_TEMP_T3  210         // 默认温度 单位：℃

#define DEFAULT_S2_TIME_T1  120         // 默认时间 单位：s
#define DEFAULT_S2_TIME_T2  60          // 默认时间 单位：s
#define DEFAULT_S2_TIME_T3  120         // 默认时间 单位：s

#define DEFAULT_S3_TEMP_T1  150         // 默认温度 单位：℃
#define DEFAULT_S3_TEMP_T2  190         // 默认温度 单位：℃
#define DEFAULT_S3_TEMP_T3  230         // 默认温度 单位：℃

#define DEFAULT_S3_TIME_T1  120         // 默认时间 单位：s
#define DEFAULT_S3_TIME_T2  90          // 默认时间 单位：s
#define DEFAULT_S3_TIME_T3  90          // 默认时间 单位：s

#define MAX_WORK_TIME       (10*60)

#define DEFAULT_TEMP_ADJUST  0         // 默认温度调整 单位：℃
#define DEFAULT_KP  48          // 默认kp
#define DEFAULT_KI  1           // 默认ki
#define DEFAULT_KD  0           // 默认kd
#define DEFAULT_MAX_TIME  600         // 默认工作时间 单位：min
#define DEFAULT_MAX_POWER  100         // 默认工作功率 单位：%

// 定义最大温度调整
#define MAX_TEMP_ADJUST  20        // 最大温度调整 单位：℃
#define MIN_TEMP_ADJUST  -20        // 最小温度调整 单位：℃

// 定义最大kp
#define MAX_KP  200        // 最大kp 
#define MIN_KP  0          // 最小kp 

// 定义最大ki
#define MAX_KI  200        // 最大ki 
#define MIN_KI  0          // 最小ki 
// 定义最大kd
#define MAX_KD  200        // 最大kd
#define MIN_KD  0          // 最小kd

// 定义最大工作时间
#define MAX_TIME  600        // 最大工作时间 单位：min
#define MIN_TIME  1          // 最小工作时间 单位：min

// 定义最大工作功率
#define MAX_POWER  100        // 最大工作功率 单位：%
#define MIN_POWER  0          // 最小工作功率 单位：%

#define SET_DATA_NUM_MIN  0         // 设置数据数量



// 菜单测试程序
#define MENU_TEST 0

void menu_seting_create(void);

void menu_next_layer(void);

void menu_add_layer(void);

void menu_sub_layer(void);

void menu_next_set_data_layer(void);

void menu_last_layer(void);

void menu_scan(void);

void menu_seting_data_init(void);

void Heating_Time_Deal_1000ms(void);

void menu_add_layer_long(void);

void menu_sub_layer_long(void);


#endif






